package option

const (
	KB int = 1024
	MB     = 1024 * KB
	GB     = 1024 * MB

	BlockPartFileSuffix string = ".part"  // 区块分片文件的后缀
	BlockDataFileSuffix        = ".block" // 区块数据文件的后缀
	DataFileSuffix             = ".data"  // 数据文件的后缀

	BlockPartDir = "blockPart" // 区块分片文件所在的目录
	BlockDataDir = "block"     // 区块数据文件所在的目录
	DataFileDir  = "data"      // 数据文件所在的目录
)

type Option struct {
	BTreeDegreeForIndex    int    // 内存索引的BTree的阶数
	BTreeDegreeForMemTable int    // MemTable的BTree的阶数
	DiskFileSize           int    // 数据文件的阈值
	DataDir                string // 数据的目录

	MergeDir            string // merge文件所在的目录
	MergeHintFilename   string // merge索引文件的名称
	MergeFinishFileName string // 标识merge完成的文件的名称

	MemTableSize int    // MemTable的大小
	WalFilePath  string // wal文件的目录
	WalDisabled  bool   // 是否禁用wal

	EnableBlockDataCache bool // 是否启用区块非分片数据的缓存

	ProbationLimit  int // probation区域的大小   50%
	ProtectionLimit int // protection区域的大小  50%

	MemIndexNum int
}

func DefaultOption() *Option {
	return &Option{
		BTreeDegreeForMemTable: 32,
		BTreeDegreeForIndex:    32,
		DiskFileSize:           512 * MB, // 32KB or 64MB,
		DataDir:                "/tmp/memcask/data",
		MemTableSize:           128 * MB, // 16KB or 4GB
		MergeDir:               "/tmp/memcask/merge",
		MergeHintFilename:      "merge-hint",
		MergeFinishFileName:    "merge-finish",
		WalFilePath:            "/tmp/memcask/data/wal.log",
		WalDisabled:            true,
		EnableBlockDataCache:   false,
		ProbationLimit:         8 * KB,
		ProtectionLimit:        8 * KB,
		MemIndexNum:            8,
	}
}
